import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    //首先定义Socket对象，要进行网络通信，必须使用Socket对象
    public DatagramSocket socket = null;
    //给服务器绑定端口
    public UdpEchoServer(int port) throws SocketException {
        //构造服务器的同时,绑定一个端口,不一定能绑定成功
        // 同一个主机上, 一个端口, 同一时刻, 只能被一个进程绑定.
        this.socket = new DatagramSocket(port);
    }
    //服务器启动逻辑

    public void start() throws IOException {
        System.out.println("服务器启动");
        /*
        服务器逻辑，请求数据，解析数据，将数据返回给客户端
         */
        while(true){
            //构造一个容器来接收客户端的数据
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            //服务端从网卡读取数据将数据填充到构造的容器中,容器中没有数据服务器会阻塞等待
            socket.receive(requestPacket);
            //为了方便使用,将请求打包成字符串
            String request= new String(requestPacket.getData(),0,requestPacket.getLength());
            //根据客户端的请求做出计算,此处省略详细计算
            String response = process(request);
            //再构造一个容器将容器填充并返回给客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.length(), requestPacket.getSocketAddress());
            //返回给客户端
            socket.send(responsePacket);
            //打印出返回结果
            System.out.printf("[%s:%d] req: %s resp: %s\n",requestPacket.getSocketAddress(),requestPacket.getPort(),request,response);
        }
    }

    public String process(String request) {
        return request;
    }
    //启动服务器并绑定端口号
    public static void main(String[] args) throws IOException {
        UdpEchoServer  udpEchoServer = new UdpEchoServer(9090);
        udpEchoServer.start();
    }
}
